/*
 * comunicacion.java
 * Objetivo: Clase que abstrae la comunicación mediante socket multicast.
 * Última fecha de modificación: 25 de Mayo de 2010
 * Autor: David Cabañero Vázquez.
 */


package enigma;

/************* IMPORTACIÓN DE PAQUETES *************/

import java.net.*;
import java.io.*;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.swing.*;
 

/************* ESPECIFICACIÓNDE LA CLASE *************/


public class comunicacion {
    
   private InetAddress grupo;
   private MulticastSocket socket;
   private String alias;
   private String pass;
   private int puerto;
   private seguridad comSegura;

comunicacion() throws NoSuchAlgorithmException
{
    comSegura = new seguridad("DES","sdfsjhkjhsd");
}


/*
 * Objetivo: Fija el grupo de la comunicación para la instancia de la clase.
 * Autor: David Cabañero Vázquez.
 * Parámetros de entrada: Recibe un objeto String con la dirección IP del grupo.
 */
public void setGrupo(String direccion)
   {
       try
       {
       grupo = InetAddress.getByName(direccion);
       } catch (IOException e)
            {
            System.out.println("IO:" + e.getMessage());

            }
   }

/*
 * Objetivo: Fija el password para la comunicación
 * Autor: David Cabañero Vázquez.
 * Parámetros de entrada: Recibe un objeto String con la nueva semilla para la contraseña.

 */
public void setPass(String passNuevo)
   {
       pass = passNuevo;
   }

/*
 * Objetivo: Fija el puerto de comunicación para la instancia del objeto.
 * Autor: David Cabañero Vázquez.
 * Parámetros de entrada: Variable entera con el número de puerto.
 */
public void setPuerto(int puertoNuevo)
   {
       puerto = puertoNuevo;
   }

/*
 * Objetivo: Guarda en alias del usuario para la instancia del objeto comunicacion.
 * Autor: David Cabañero Vázquez.
 * Parámetros de entrada: Recibe un objeto String con el alias del usuario.
 */
public void setAlias(String aliasNuevo)
   {
       alias = aliasNuevo;
   }

/*
 * Objetivo: Observador del atributo alias.
 * Autor: David Cabañero Vázquez.
 * Parámetros de salida: Retorn un objeto cadena con el alias del usuario.
 */
public String getAlias()
   {
       return alias;
   }
 
/*
 * Objetivo: Vuelve a generar los datos de encriptación cuando el usuario cambia la contraseña.
 * Autor: David Cabañero Vázquez.
 */
public void cambiarPass() throws NoSuchAlgorithmException
  {
   comSegura.clave = this.pass;
   comSegura.cambiarClave();
  }


/*
 * Objetivo: Se encarga de establecer la comuncación si es posible a través de los parámetros de la instancia del objeto comunicación.
 * Autor: David Cabañero Vázquez.
 * Parámetros de salida: Objeto de tipo MulticastSocket con el descriptor de la comunicación.
 */
public MulticastSocket Conectar() throws NoSuchAlgorithmException
    {
      try
        {
        socket = new MulticastSocket(puerto);

        // Se une al grupo
        socket.joinGroup(grupo);

        return socket;
        }
        catch (SocketException e)
            {
                System.out.println("Socket:" + e.getMessage());
            return null;
            }
        catch (IOException e)
            {
            System.out.println("IO:" + e.getMessage());
            return null;
        }

    }

/*
 * Objetivo: Envía un mensaje a través del socket multicast.
 * Autor: David Cabañero Vázquez.
 * Parámetros de entrada: Recibe un objeto String con el mensaje.
 * Parámetros de salida: Devuelve valor booleano asegurandose de que el envío se ha realizado correctamente.
 */
public boolean Enviar(String Mensaje) throws NoSuchPaddingException, NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException
    {
       try
        {
        Mensaje = comSegura.encriptar(Mensaje);
        byte[] m = Mensaje.getBytes();
        DatagramPacket mensajeSalida =
	new DatagramPacket(m, m.length, grupo, puerto);
        socket.send(mensajeSalida);
        return true;
        }
        catch (SocketException e)
            {
                System.out.println("Socket:" + e.getMessage());
                return false;
            }
        catch (IOException e)
            {
                System.out.println("IO:" + e.getMessage());
                return false;
            }
    }

/*
 * Objetivo: Método que implementa una espera ocupada para la recepción de mensajes.
 * Autor: David Cabañero Vázquez.
 * Parámetros de entrada: Objeto JList de las librerías Swing
 */
public void Recibir(javax.swing.JList listaVisualizar) throws NoSuchPaddingException, InvalidKeyException, NoSuchAlgorithmException, IllegalBlockSizeException, BadPaddingException
    {
    
    byte[] bufer = new byte[1000];
      String linea;
      DefaultListModel modelo = new DefaultListModel();
        try
        {
      // Se queda a la espera de mensajes al grupo, hasta recibir "Adios"
        while (true) {
	DatagramPacket mensajeEntrada = new DatagramPacket(bufer, bufer.length);
        socket.receive(mensajeEntrada);
        linea = new String(mensajeEntrada.getData(), 0, mensajeEntrada.getLength());
        linea = comSegura.desencriptar(linea);
        modelo.addElement(linea);
        listaVisualizar.setModel(modelo);
        System.out.println(linea);
        }
        }
        catch (SocketException e)
            {
                System.out.println("Socket:" + e.getMessage());
            }
        catch (IOException e)
            {
            System.out.println("IO:" + e.getMessage());
        }
    }


}


